Jochen Zeirzer

Abanico

The fan is not merely the superficial utensil for cooling on hot summer days, but equally an instrument of coquetry and communication. It is an accessory that like its archetype - the plumage of some birds - serves to attract attention and zestfulness. The work Abanico takes advantage of these qualities of the fan: A sensor detects persons infront of the work, the machine unfolds a wooden folding fan and performs a classic gesture, with which it aspires attention.



Abanico01.jpg

Abanico02.jpg

Photography: Image Recorder


Technical description
 

wooden fan, aluminium plates, steel tube, Grove Ultrasonic Ranger, servo motors,
Arduino Duemilanove, custom electronics
 

Abanico03.jpg

Abanico04.jpg

Arduino - Code

/* Created by Jochen Zeirzer http://www.jochen_zeirzer.public2.linz.at/ project: abanico year: 2013
Ping))) Sensor http://www.arduino.cc/en/Tutorial/Ping
created 3 Nov 2008 by David A. Mellis modified 30 Aug 2011 by Tom Igoe */
#include <VarSpeedServo.h>
//Servos // create variable speed servo objects to control servos 1-3 VarSpeedServo servo1; // Servo to tilt Fan VarSpeedServo servo2; // Servo to open and close Fan VarSpeedServo servo3; // Servo to rotate Base
int trans1 = 6; // transistor to switch Servo 1 on Pin 11 int trans2 = 5; // transistor to switch Servo 2 on Pin 10 int trans3 = 3; // transistor to switch Servo 3 on Pin 9
int counter; // initialize a counter to count how often the distance has been measured int wait = 5250; // initialize a delay for the calibration movement - every 5250 measurements (approx. every 10 min)
const int pingPin = 7; // Grove Ultrasonic Ranger on Pin 7 const int threshold = 140; // Threshold level digital input (Ultra Sonic Ranger)
void setup() {
// initialize serial communication Serial.begin(9600);
pinMode(trans1, OUTPUT); // initialize the Transistors 1 - 3 as output: pinMode(trans2, OUTPUT); pinMode(trans3, OUTPUT);
servo1.attach(11); // Servo 1 (Fan Tilt) on pin 11 servo1.writeMicroseconds(620); // variable speed servo1 position in Microdseconds servo2.attach(10); // Servo 2 (Fan open/close) on pin 10 servo2.writeMicroseconds(570); // variable speed servo1 position in Microdseconds servo3.attach(9); // Servo 3 (Base rotation) on pin 9 servo3.writeMicroseconds(600); // variable speed servo1 position in Microdseconds
digitalWrite(trans1, LOW); // Set default state of Transistors 1 - 3 to LOW digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); }
long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; }
void loop() {
counter += 1; // establish variables for duration of the ping, // and the distance result in centimeters: long duration, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH // pulse whose duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. pinMode(pingPin, INPUT); duration = pulseIn(pingPin, HIGH);
// convert the time into a distance cm = microsecondsToCentimeters(duration);
int digitalValue = microsecondsToCentimeters(duration);
Serial.print(cm); Serial.print("cm"); Serial.print(", counter "); Serial.print(counter); Serial.println();
delay(100);
if(counter >= wait) { // If the counter reaches the benchmark of "wait" (5250 distance measurments) start calibration movement
digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo1.writeMicroseconds(620); servo2.writeMicroseconds(570); servo3.writeMicroseconds(600); delay(100); servo2.slowmove(2500, 40); delay(1800); digitalWrite(trans1, LOW); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); delay(5000); digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo2.slowmove(600, 40); delay(1500); servo2.writeMicroseconds(600); delay(100); digitalWrite(trans1, LOW); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); counter = 0; // reset counter to 0 }
if(digitalValue < threshold) { // If the measured distance drops below 140cm start full movement of the fan counter = 0; // reset counter to 0
digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo1.slowmove(1625, 120); delay(350); servo2.slowmove(2500, 160); delay(600); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); delay(500); digitalWrite(trans1, HIGH); digitalWrite(trans3, HIGH); servo1.slowmove(880, 20); servo3.slowmove(2350, 60); delay(1300); digitalWrite(trans3, LOW); delay(50); digitalWrite(trans1, LOW); delay(4000); digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo1.slowmove(620, 10); servo2.slowmove(625, 40); servo3.slowmove(580, 40); delay(1620); servo2.writeMicroseconds(570); delay(200); digitalWrite(trans1, LOW); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); delay(4000);
counter = 0; // reset counter to 0
} }

 

The machine Abanico is part of my final projekt TRIVIAL MOTION at the Art University Linz, Department for Experimental Arts.

The diploma TRIVIAL MOTION is available in german only.